#!/usr/bin/env perl
#
# Copyright (c) 2019 Martin Storsjo
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

use strict;

sub dodir($);

my %mapping;

sub dodir($) {
  my $dir = shift;

  #print "DIR: $dir\n";

  opendir IN, $dir;
  my @dir = readdir IN;
  closedir IN;

  foreach my $i (@dir) {
    next if($i eq ".");
    next if($i eq "..");
    next if(-l "$dir/$i");

    if(-d "$dir/$i") {
      dodir("$dir/$i");
    } else {
      #print "FILE: $dir/$i\n";
      open FHIN,"$dir/$i" || die("Can't read $dir/$i");
      open FHOUT,">$dir/$i.out" || die("Can't write to $dir/$i.out");

      while(my $line = <FHIN>) {
        # Make sure to match '#include <foo>' or '#include "bar"', but not
        # '#include IDENTIFIER'.
        if($line =~ m/^\s*#\s*include\s+["<][\w\.\/\\]+[">]/) {
          my @values = split('//', $line);
          $values[0] =~ tr [A-Z\\] [a-z/];

          foreach my $from (keys %mapping) {
            my $to = $mapping{$from};
            $values[0] =~ s,$from,$to,;
          }

          $line = join('//', @values);
        }
        $line =~ s/[\r\n]//g;
        print FHOUT "$line\n";
      }

      close(FHIN);
      close(FHOUT);
      unlink "$dir/$i";
      rename "$dir/$i.out", "$dir/$i";
    }
  }
}

my @paths;
for (my $i = 0; $i < @ARGV; $i++) {
  my $arg = $ARGV[$i];
  if ($arg eq "-map_winsdk") {
    # Map references to e.g. GL/gl.h to keep that canonical spelling.
    $mapping{lc("GL/")} = "GL/";
  } else {
    push @paths, $arg;
  }
}
die("Usage: fixinclude dir\n") if(@paths != 1);
dodir($paths[0]);
